import { instantiate, Prefab } from 'cc';
import { app } from '../../application';
import { HintAlertInfo } from '../../declarations';
import { ccclass, ccmodifier } from '../../decorators';
import { HintAlert } from './HintAlert';
import { HintStack } from './HintStack';

/**
 * - 作者: DoooReyn
 * - 日期: 2023.11.02
 * - 名称: HintAlertStack
 * - 描述: 警告提示堆栈
 * - 说明: 警告相当于一个顶层弹窗，且同时只能显示一个，新的警告会覆盖旧的警告
 */
@ccclass('HintAlertStack')
@ccmodifier('HintAlertStack')
export class HintAlertStack extends HintStack {
    /**
     * 添加警告提示
     * @param cfg 警告提示配置
     */
    async addTip(cfg: HintAlertInfo): Promise<void> {
        // 如果已经有警告提示，先移除它
        if (this.node.children.length > 0) {
            await this.node.children[0].getComponent(HintAlert)!.hide();
        }

        // 显示警告提示
        const prefab = await app.resLoader.loadOne({ path: cfg.path, bundle: cfg.bundle, type: Prefab });
        if (prefab && prefab.data.getComponent(HintAlert)) {
            const node = instantiate(prefab);
            this.node.addChild(node);
            const comp = node.getComponent(HintAlert)!;
            await comp.show(cfg);
        } else {
            this.logger.error('预制体不存在或未包含 HintAlert 组件:', cfg, prefab);
        }
    }

    async enter(): Promise<void> {
        await this.hide();
        this.logger.debug('进入舞台');
    }

    async exit() {
        this.node.destroyAllChildren();
        await super.exit();
    }
}
